different types of java applications